#ifndef __TIMER_H
#define __TIMER_H

#include "reg52.h"
#include "type.h"
#include "interrupt.h"     
#include "gpio.h"

/***********************************************************************************************************************
��ʱ��0����
***********************************************************************************************************************/
#define  SET_TIMER0_COUNTER()       do{CLR_Bit(TMOD, 2);SET_Bit(TMOD, 2);}while(0)
#define  SET_TIMER0_TIMER()         do{CLR_Bit(TMOD, 2);}while(0) 

#define  SET_TIMER0_THIRTEEN_MODE() do{CLR_Bit(TMOD, 1);CLR_Bit(TMOD, 0);}while(0)
#define  SET_TIMER0_SIXTEEN_MODE()  do{CLR_Bit(TMOD, 1);CLR_Bit(TMOD, 0);SET_Bit(TMOD, 0);}while(0)                                                  
#define  SET_TIMER0_AUTO_RELOAD()   do{CLR_Bit(TMOD, 1);CLR_Bit(TMOD, 0);SET_Bit(TMOD, 1);}while(0)

#define  TIMER0_START()             do{CLR_Bit(TCON, 4);SET_Bit(TCON, 4);}while(0)
#define  TIMER0_STOP()              do{CLR_Bit(TCON, 4);}while(0)

/***********************************************************************************************************************
��ʱ��1����
***********************************************************************************************************************/
#define  SET_TIMER1_COUNTER()       do{CLR_Bit(TMOD, 6);SET_Bit(TMOD, 6);}while(0)
#define  SET_TIMER1_TIMER()         do{CLR_Bit(TMOD, 6);}while(0) 

#define  SET_TIMER1_THIRTEEN_MODE() do{CLR_Bit(TMOD, 5);CLR_Bit(TMOD, 4);}while(0)
#define  SET_TIMER1_SIXTEEN_MODE()  do{CLR_Bit(TMOD, 5);CLR_Bit(TMOD, 4);SET_Bit(TMOD, 4);}while(0)                                                  
#define  SET_TIMER1_AUTO_RELOAD()   do{CLR_Bit(TMOD, 5);CLR_Bit(TMOD, 4);SET_Bit(TMOD, 5);}while(0)
#define  SET_TIMER1_DIVISION()      do{CLR_Bit(TMOD, 5);CLR_Bit(TMOD, 4);SET_Bit(TMOD, 5);SET_Bit(TMOD, 4);}while(0)

#define  TIMER1_START()             do{CLR_Bit(TCON, 6);SET_Bit(TCON, 6);}while(0)
#define  TIMER1_STOP()              do{CLR_Bit(TCON, 6);}while(0)

/***********************************************************************************************************************
��ʱ��2����
***********************************************************************************************************************/
#define  SET_TIMER2_COUNTER()       do{CLR_Bit(TMOD, 2);SET_Bit(TMOD, 2);}while(0)
#define  SET_TIMER2_TIMER()         do{CLR_Bit(TMOD, 2);}while(0)  

#define  SET_TIMER2_THIRTEEN_MODE() do{CLR_Bit(TMOD, 1);CLR_Bit(TMOD, 0);}while(0)
#define  SET_TIMER2_SIXTEEN_MODE()  do{CLR_Bit(TMOD, 1);CLR_Bit(TMOD, 0);SET_Bit(TMOD, 0);}while(0)                                                  
#define  SET_TIMER2_AUTO_RELOAD()   do{CLR_Bit(TMOD, 1);CLR_Bit(TMOD, 0);SET_Bit(TMOD, 1);}while(0)

#define  TIMER2_START()             do{CLR_Bit(TCON, 4);SET_Bit(TCON, 4);}while(0)
#define  TIMER2_STOP()              do{CLR_Bit(TCON, 4);}while(0)

/***********************************************************************************************************************
ϵͳʱ������
***********************************************************************************************************************/
typedef struct _SYS_TIME_T
{

    INT8U  hour; 
    INT8U    min;
    INT8U    sec;   
    INT16U timer_msec;
    INT16U msec;
    INT8U state;
    INT8U  week_day;
    INT16U year;
    INT8U  month;
    INT8U  month_day;
}SYS_TIME_T;


#define CLOCK_RUNNING 0
#define CLOCK_SETTING 1

/***********************************************************************************************************************
ϵͳʱ������
***********************************************************************************************************************/
typedef struct _SYS_ALARM_T
{
    INT8U  hour;
    INT8U  min;
    INT8U  sec;
}SYS_ALARM_T;

/***********************************************************************************************************************
ϵͳʱ�Ӻ����ӿ�
***********************************************************************************************************************/
extern void system_1ms_init(void);
extern void delay_10us(void);
extern void delay_100us(void);
extern void delay_ms(INT8U count);
extern void get_system_time(INT8U *_time_buffer, SYS_TIME_T *_sys_time_t, INT8U _flag);

#endif
